package co.edu.udea.impl;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import co.edu.udea.dao.HibernateSessionFactory;
import co.edu.udea.dao.SolicitudDao;
import co.edu.udea.model.Solicitud;
import exceptions.ExecptionRTF;

/**
 * 
 * @author Cristina Isabel Mejia Gonzalez
 *
 */
public class SolicitudImp implements SolicitudDao{

	Logger log = Logger.getLogger(this.getClass());
	
	/**
	 * @param solicitud, Metodo que perite guardar una nueva solicitud
	 * @return devuelve la solicitud si el proceso fue exitoso
	 */
	@Override
	public Solicitud generarSolicitud(Solicitud solicitud)  throws ExecptionRTF {
		Session sesion = null;
		Transaction tx = null;
		try {
			sesion = HibernateSessionFactory.getInstance().getSession();
			tx = sesion.beginTransaction();
			sesion.save(solicitud);
			tx.commit();
			
			return solicitud;
			
		} catch (Exception e) {

			log.error("No se pudo guardar solicitud", e); 
			throw new ExecptionRTF(e);
		}
		
	}

	/**
	 * 
	 * @return devuelve el listado de solicitudes con estados pendientes
	 */
	@Override
	public List<Solicitud> obtenerSolicitudesPendientes()  throws ExecptionRTF{
		Session sesion = null;
		Transaction tx = null;
		try {
			sesion = HibernateSessionFactory.getInstance().getSession();
			tx = sesion.beginTransaction();
			return sesion.createCriteria(Solicitud.class).add(Restrictions.eq("estadoSolicitud", 1)).list();
			
		} catch (Exception e) {

			log.error("No se pudieron buscar las solicitudes pendientes", e); 
			throw new ExecptionRTF(e);
		}
	}

	/**
	 * @param codigoSolicitud, Metodo que obtiene una solicitud segun su codigo
	 * @return devuelve la solicitud si el proceso fue exitoso
	 */
	@Override
	public Solicitud obtenerSolicitud(String codigoSolicitud)  throws ExecptionRTF{
		Session sesion = null;
		Transaction tx = null;
		try {
			sesion = HibernateSessionFactory.getInstance().getSession();
			tx = sesion.beginTransaction();
			return (Solicitud) sesion.get(Solicitud.class, codigoSolicitud);
			
		} catch (Exception e) {

			log.error("No se pudieron buscar las solicitudes pendientes", e); 
			throw new ExecptionRTF(e);
		}
	}

}
